package tongge.bit;

import java.util.Arrays;
import java.util.BitSet;

/**
 * @author wangmaolin1
 * @date 2023/8/6 15:20
 */
public class BigMap {

    private long[] bits;

    public BigMap(int size) {
        this.bits = new long[size / 64 + 1];
    }

    public void set(int offset) {
        //当进行左移运算时，如果移动的位数超过了该类型的最大位数，那么编译器会对移动的位数取模，例如对int类型的数移动33位，实际上只移动了33%32=1位
        // long 同理  1 << offset 等价于 1 << (offset % 64)
        bits[offset / 64] |= 1L << offset;
    }

    public void clear(int offset) {
        bits[offset / 64] &= ~(1L << offset);
    }

    public int get(int offset) {
        //由于int型变量只占4Byte（32bit），因此当右移地位数超过32bit时，移位运算没有任何意义。
        // 所以，在Java语言中，为了保证移动位数地有效性，以使右移的位数不超过32bit，采取了取余的操作，即a>>n等价于a>>(n%32)。
        // long同理, 1L >> offset 等价于 1  >>(offset % 64)
        return (int) (bits[offset / 64]>> offset &1);
    }

    public static void main(String[] args) {
        BigMap bigMap = new BigMap(100000000);
        int offset=66;
        int offset2=130;
        bigMap.set(offset);
//        System.out.println(Arrays.toString(bigMap.bits));

        bigMap.set(offset2);
//        System.out.println(Arrays.toString(bigMap.bits));
        System.out.println(bigMap.get(offset));
        System.out.println(bigMap.get(offset2));
        bigMap.clear(offset);
//        bigMap.clear(offset2);
//        System.out.println(Arrays.toString(bigMap.bits));

        System.out.println(bigMap.get(offset));
        System.out.println(bigMap.get(offset2));


        //java内置

        BitSet bs=new BitSet(100);
        bs.set(offset);
        System.out.println(bs.get(offset));
        bs.clear(offset);
        System.out.println(bs.get(offset));

        System.out.println(8&-8);

        System.out.println(5&3);

    }
}
